# -*- coding: utf-8 -*-
'''
Created on 2009-04-13

@author: argaz
'''
import xmlrpclib
#import pickle
import tkMessageBox as msgBox
from BD_InterfaceBaseDonnees import *
import sys
"""
TODO//
    Optimiser le code pour reduire la communication client-serveur
    Ajouter le code pour la suppression et la modification des champs 
    Tester la vue d'�dition dans la vue principale
"""
try:
    from xTkinter import *
except:
    print >> sys.stderr, 'Le module xTkinter est  introuvable'  
    sys.exit(1)

class VueCreationTable(Frame):
    FonctionDB=[]
    def __init__(self,master,parent,**cnf):
        Frame.__init__(self,master,cnf)
        KeysList=cnf.keys()
        self.parent = parent
        self.master=master
        self.width=400
        self.height=200
        if ('width' in KeysList):
            self.width=cnf['width']
        if ('width' in KeysList):
            self.height=cnf['height']
        Frame.__init__(self,master,cnf)        
        self.master.update()
        self.x=self.master.winfo_width()/2-(self.width/2)
        self.y=self.master.winfo_height()/2-(self.height/2)       
        self.place(x=self.x,y=self.y)
        """
        Variable qui va servir a determiner si les donn�es d'un
        champs ont �t� modifi�s par l'utilisateur
        """
        self.champtampon=None
        
        """
        Inscription des m�thodes dans un tableau pour
        faciliter l'acc�s simplement par indice
        """
        """
        VueEditionTable.FonctionDB.append(self.parent.BaseDonnees.AjouterChamps)
        VueEditionTable.FonctionDB.append(self.parent.BaseDonnees.ModifierChamps)
        VueEditionTable.FonctionDB.append(self.parent.BaseDonnees.SupprimerChamps)
        """
        self.configure(width=411,height=272)
        LTable=xLabel(self,text='Table à créer',height=1,width=15)
        LTable.setLocation(10,10)
        ETable=xEntry(self,width=15)
        ETable.setLocation(80,10)       
        "  Liste des tables existantes "
        LListeTables=xLabel(self,text='Tables éxistantes',height=1,width=15)
        LListeTables.setLocation(210,10)
        self.CBListeTables=xCombobox(self,width=10)
        self.CBListeTables.setLocation(310,10)
        self.CBListeTables.setListWidth(15) 
        self.CBListeTables.setListHeight(3)       
        self.CBListeTables.setText('<aucune>')
        self.TableSelectionne = None
        LChamps=xLabel(self,text='Champs de la table',height=1,width=18)
        LChamps.setLocation(210,40)
        
        " Pour recharger la liste des tables"
        RechargeTables=xButton(self,text='Créer')
        RechargeTables.setLocation(180,10)
        RechargeTables.configure(anchor=CENTER)
        RechargeTables.setCommand(self.listTables)
        
        " Liste des champs d'une table selectionnée"
        self.CBListeChamps=xCombobox(self,width=7)
        self.CBListeChamps.setLocation(310,40)
        self.CBListeChamps.setWidth(12)
        self.CBListeChamps.setText('<aucun>')
        self.CBListeChamps.setListWidth(15)
        self.CBListeChamps.setListHeight(3)
        
        TitreChamps=xLabel(self,text='Titre du champs',height=1,width=15)
        TitreChamps.setLocation(10,69)
        xLabel3=xLabel(self,text='Type du champs',height=1,width=15)
        xLabel3.setLocation(106,69)
        xLabel4=xLabel(self,text='Taille',height=1,width=6)
        xLabel4.setLocation(196,69)
        xLabel5=xLabel(self,text='Précision',height=1,width=9)
        xLabel5.setLocation(239,69)
        xLabel6=xLabel(self,text='Pattern',height=1,width=7)
        xLabel6.setLocation(300,69)
        self.ETitreChamps=xEntry(self,width=15)
        self.ETitreChamps.setLocation(10,90)
        
        " Type du champs choisi"
        self.CBTypeChamps=xCombobox(self,width=11)
        self.CBTypeChamps.setLocation(107,90)
        self.CBTypeChamps.setText('<aucun>')
        self.CBTypeChamps.setListHeight(5)
        self.CBTypeChamps.setListWidth(15)
        self.CBTypeChamps.addItems(['texte','entier','date','caractère'])
        self.CBTypeChamps.setText('texte')
        def activeAttributs():
            if (self.CBTypeChamps.getText() in ['texte','entier']):
                self.SBTaille.setActive(True)
                if (self.CBTypeChamps.getText() == 'entier'):
                    self.SBPrecision.setActive(True)
            else:
                self.SBTaille.setActive(False)
                self.SBPrecision.setActive(False)
            pass
        self.CBTypeChamps.setValidator(activeAttributs)
        
        """
        Spinbutton pour changer la taille du champs 
        Fonction non encore implementée
        """
        self.SBTaille=xSpinbox(self,width=4)
        self.SBTaille.setLocation(197,90)
        self.SBPrecision=xSpinbox(self,width=7)
        self.SBPrecision.setLocation(239,90)
        self.CBPattern=xCombobox(self,width=10)
        self.CBPattern.setLocation(300,90)
        self.CBPattern.setText('<aucun>')
        
        """
        Cette colonne est prévue pour le pattern de la date
             exp jj/mm/aaaa
        """
        xLabel6.setVisible(False)
        self.CBPattern.setVisible(False)
        self.CBPattern.setActive(False)        

        """
        Choix de l'opération
        """
        LOperation=xLabel(self,text='Opération à effectuer')
        LOperation.setLocation(10,120)
        
        self.var=IntVar()
        """
        Ajouter le champs
        """

        self.BAjouter=xRadiobutton(self,text='Ajouter',height=1,width=5)
        self.BAjouter.setLocation(10,140)
        self.BAjouter.configure(value=1,variable=self.var)
        self.BAjouter.setActive(False)
        self.BValider=xButton(self,text='Valider',width=10)
        self.BValider.setLocation(330,140)
        self.BValider.configure(anchor=CENTER)
        self.BValider.setCommand(self.OperationSurChamps)
        self.BValider.setActive(False)
        self.master.bind('<Configure>',self.repaint,add='+')       

        " Fonction associ�e � l'evennement <Choix d'une table> "
     
        #self.CBListeTables.setValidator(self.obtenirChamps)
  
        " fonction associ�e � l'evennement <d�ail du champs>"

        #self.CBListeChamps.setValidator(self.obtenirDescriptionChamps)

    def repaint(self,evt):
        self.master.update()
        self.x=self.master.winfo_width()/2-(self.width/2)
        self.y=self.master.winfo_height()/2-(self.height/2)       
        self.place(x=self.x,y=self.y)
        pass
    
    def OperationSurChamps(self):
        cnom=self.ETitreChamps.getText()
        ctype=self.CBTypeChamps.getText()
        ctaille=None
        cprecision=None
        if (ctype in ['texte','entier']):
            ctaille=self.SBTaille.getValue()
            if (ctype=='entier'):
                cprecision=self.SBPrecision.getValue()

        UnChamp=xChamp(nom=cnom,
                       type=ctype.upper(),
                       taille=ctaille,
                       precision=cprecision)
        print 'Impression depuis OperationSurChamps()'
        print UnChamp.Nom,UnChamp.Type,UnChamp.Taille,UnChamp.Precision
        print self.champtampon.Nom,self.champtampon.Type,self.champtampon.Taille,self.champtampon.Precision
        if(not self.champtampon.equale(UnChamp)):
           "tuser=self.parent.user"
           tnom=self.CBListeTables.getText()
           table=xTable(nom=tnom,
                         #user=tuser,
                         user='B52equip1',
                         listechamps=[UnChamp]
                         )
           indice=self.var.get()-1
           if msgBox.askokcancel('PERP 2009 | �dition de tables', 'Attention vous �tes'+\
                                  ' sur le point de modifier\n le champs '+ cnom+ ' de la table '+\
                                  tnom+'\nVoulez-vous effectuez les modifiction?'):
               VueEditionTable.FonctionDB[indice](table)
        pass
        
    def listTables(self):
        Reponse = self.parent.BaseDonnees.ObtenirTable()
        if (Reponse[0]==1):
            self.CBListeTables.clear()
            self.CBListeTables.setListHeight(3)
            NomsTable = Reponse[1]
            for NomTable in NomsTable:
                self.CBListeTables.addItem(NomTable)
            self.CBListeTables.setSelected(0)
            self.CBListeTables.setText('<CHOISIR>')
            
            
        else:
            msgBox.showerror('PERP 2009 | �dition des tables', 'Une erreur est survenue!\n'+Reponse[1])
        pass
    
    def close(self):
        self.destroy()
        pass
    
    def __del__(self):
        self.master.unbind('<Configure>')
        pass